package com.itheima.interface5; // 包声明：声明当前类属于com.itheima.interface5包

public class Test { // 定义一个公开的Test类
    public static void main(String[] args) { // 主方法：程序的入口点，JVM会从这里开始执行代码
        // 目标：理解接口的几点注意事项。
        Dog d = new Dog(); // 创建Dog类的对象
        d.go(); // 调用Dog类中的go()方法
    } // 主方法结束
} // Test类结束

// 4、一个类实现了多个接口，如果多个接口中存在同名的默认方法，可以不冲突，这个类重写该方法即可。
interface A3 { // 定义接口A3
    default void show(){ // 接口中的默认方法show()
        System.out.println("接口中的 A3 show 方法"); // 打印输出信息
    }
}

interface B3 { // 定义接口B3
    default void show(){ // 接口中的默认方法show()，与A3接口中的方法名相同
        System.out.println("接口中的 B3 show 方法"); // 打印输出信息
    }
}

class Dog2 implements A3, B3 { // Dog2类同时实现A3和B3两个接口
    @Override // 重写注解，表示这个方法是重写了父类或接口中的方法
    public void show() { // 必须重写show()方法来解决冲突
        A3.super.show(); // A3干爹的：调用A3接口中的show()方法
        B3.super.show(); // B3干爹的：调用B3接口中的show()方法
    }
}

// 3、一个类继承了父类，又同时实现了接口，如果父类中和接口中有同名的方法，实现类会优先用父类的。[了解]
interface A2 { // 定义接口A2
    default void show(){ // 接口中的默认方法show()
        System.out.println("接口中的 A2 show 方法"); // 打印输出信息
    }
}

class Animal{ // 定义Animal父类
    public void show(){ // 父类中的show()方法
        System.out.println("父类中的 show 方法"); // 打印输出信息
    }
}

class Dog extends Animal implements A2 { // Dog类继承Animal父类，同时实现A2接口
    public void go(){ // Dog类中的go()方法
        show(); // 父类的：直接调用show()方法，默认调用父类的方法
        super.show(); // 父类的：使用super关键字明确调用父类的show()方法
        A2.super.show(); // A2接口的方法：使用接口名.super明确调用接口中的默认方法
    }
}


// 2、一个接口继承多个接口，如果多个接口中存在方法签名冲突，则此时不支持多继承，也不支持多实现。[了解]
interface A1 { // 定义接口A1
    void show(); // 抽象方法show()，返回值为void
}
interface B1 { // 定义接口B1
    String show(); // 抽象方法show()，返回值为String，与A1接口中的方法签名冲突
}
//interface C1 extends A1, B1 { // 这行被注释掉了，因为会发生方法签名冲突
//}
//class D1 implements A1, B1{ // 这行也被注释掉了，同样会发生方法签名冲突
//}


// 1、接口与接口可以多继承：一个接口可以同时继承多个接口[重点]。
// 类与类： 单继承 一个类只能继承一个直接父类
// 类与接口：多实现，一个类可以同时实现多个接口。
// 接口与接口： 多继承，一个接口可以同时继承多个接口。
interface A { // 定义接口A
    void show1(); // 抽象方法show1()
}
interface B { // 定义接口B
    void show2(); // 抽象方法show2()
}
interface C extends B , A{ // 接口C同时继承接口B和接口A（接口的多继承）
    void show3(); // 接口C自己的抽象方法show3()
}
class D implements C{ // 类D实现接口C，因此需要实现接口C及其父接口的所有抽象方法
    @Override // 重写注解
    public void show3() { // 实现接口C的show3()方法
    }
    @Override // 重写注解
    public void show1() { // 实现接口A的show1()方法
    }
    @Override // 重写注解
    public void show2() { // 实现接口B的show2()方法
    }
}